Cual es la mejor estrategia para adivinar?

Por Miguel Escalona


In [ ]:
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline


from IPython.display import Image

¡Adivina Quién es!

El juego de adivina quién es, consiste en adivinar el personaje que tu oponente ha seleccionado antes de que él/ella adivine el tuyo. La dinámica del juego es:

  • Cada jugador elige un personaje al azar
  • Por turnos, cada jugador realiza preguntas de sí o no, e intenta adivinar el personaje del oponente.
  • Las preguntas válidas están basadas en la apariencia de los personajes y deberían ser fáciles de responder.
  • Ejemplo de pregunta válida: ¿Tiene el cabello negro?
  • Ejemplo de pregunta no válida: ¿Luce como un ex-presidiario?

A continuación, cargamos el tablero con los personajes.


In [ ]:
Image('data/guess_who_board.jpg', width=700)

Cargando los datos

Para la carga de datos usaremos la función read_csv de pandas. Pandas cuenta con un amplio listado de funciones para la carga de datos. Mas informacion en la documentación de la API.


In [ ]:
df = pd.read_csv('data/guess_who.csv', index_col='observacion')
df.head()

¿Cuántos personajes tenemos con cada caracteristica?


In [ ]:
#Separamos los tipos de variables
categorical_var = 'color de cabello'
binary_vars = list(set(df.keys()) - set([categorical_var, 'NOMBRE']))

In [ ]:
# Para las variables booleanas calculamos la suma
df[binary_vars].sum()

In [ ]:
# Para las variables categoricas, observamos la frecuencia de cada categoría
df[categorical_var].value_counts()

In [ ]:
labels = df['NOMBRE']
del df['NOMBRE'] 
df.head()

In [ ]:
labels

Codificación de variables categóricas


In [ ]:
from sklearn.feature_extraction import DictVectorizer
vectorizer = DictVectorizer(sparse=False)
ab=vectorizer.fit_transform(df.to_dict('records'))
dft = pd.DataFrame(ab, columns=vectorizer.get_feature_names())
dft.head()

Entrenando un arbol de decisión


In [ ]:
from sklearn.tree import DecisionTreeClassifier

classifier = DecisionTreeClassifier(criterion='entropy', splitter='random', random_state=42)
classifier.fit(dft, labels)

Obtención de los pesos de cada feature


In [ ]:
classifier.feature_importances_

In [ ]:
feat = pd.DataFrame(index=dft.keys(), data=classifier.feature_importances_, columns=['score'])
feat = feat.sort_values(by='score', ascending=False)

In [ ]:
feat.plot(kind='bar',rot=85,figsize=(10,4),)

In [ ]:

Bonus: Visualizando el arbol, requiere graphviz

conda install graphviz

In [ ]:
from sklearn.tree import export_graphviz
dotfile = open('guess_who_tree.dot', 'w')
export_graphviz(
    classifier, 
    out_file = dotfile, 
    filled=True, 
    feature_names = dft.columns, 
    class_names=list(labels), 
    rotate=True, 
    max_depth=1, 
    rounded=True,
)
dotfile.close()

In [ ]:
!dot -Tpng guess_who_tree.dot -o guess_who_tree.png

In [ ]:
Image('guess_who_tree.png', width=1000)

In [ ]: